package com.huas.xml;

/*
 import java.io.File;

 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;

 import org.w3c.dom.Attr;
 import org.w3c.dom.Comment;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;

 public class ReadXML {

 *//**
 * @param args
 */
/*
 public static void main(String[] args) throws Exception {
 DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
 DocumentBuilder builder=dbf.newDocumentBuilder();
 Document doc=builder.parse(new File("student.xml"));
 //通过递归调用来便利怎么XML文档的所有的元素
 //获得根元素节点
 Element element=doc.getDocumentElement();
 ReadXML.parseElement(element);


 }
 public static void parseElement(Element element){
 //获得标签名称，通过这个名称来判断节点的类型
 String tagName=element.getNodeName();

 short type=element.getNodeType();
 NodeList children=element.getChildNodes();
 System.out.print("<"+tagName);
 NamedNodeMap map=element.getAttributes();
 //判断是否有属性
 if(null!=map){
 for(int i=0;i<map.getLength();i++){
 Attr attr=(Attr)map.item(i);
 System.out.print(" "+attr.getName()+"=\""+attr.getValue()+"\"");

 }
 }
 //关闭属性标签
 System.out.print(">");

 //处理它的孩子节点
 for(int i=0;i<children.getLength();i++){
 Node node=children.item(i);
 //要判断子节点的类型
 if(type==Node.ELEMENT_NODE){
 //是元素子节点，则递归调用本身
 parseElement((Element)node);
 }
 else if(type==Node.TEXT_NODE){
 //文本节点则直接输出它的文本内容
 System.out.print(node.getNodeValue());
 }
 else if(type==Node.COMMENT_NODE){
 System.out.print("<--");
 //如果是注释节点
 Comment comment=(Comment)node;
 //取得注释的内容
 String content=comment.getData();
 System.out.print(content);
 System.out.print("-->");
 }
 }
 System.out.print("</"+tagName+">");
 }
 }
 */

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Attr;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * 使用递归解析给定的任意一个xml文档并且将其内容输出到命令行上
 * 
 * @author zhanglong
 * 
 */
public class ReadXML
{
	public static void main(String[] args) throws Exception
	{
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();

		Document doc = db.parse(new File("build.xml"));
		// 获得根元素结点
		Element root = doc.getDocumentElement();

		parseElement(root);
	}

	private static void parseElement(Element element)
	{
		String tagName = element.getNodeName();

		NodeList children = element.getChildNodes();

		System.out.print("<" + tagName);

		// element元素的所有属性所构成的NamedNodeMap对象，需要对其进行判断
		NamedNodeMap map = element.getAttributes();

		// 如果该元素存在属性
		if (null != map)
		{
			for (int i = 0; i < map.getLength(); i++)
			{
				// 获得该元素的每一个属性
				Attr attr = (Attr) map.item(i);

				String attrName = attr.getName();
				String attrValue = attr.getValue();

				System.out.print(" " + attrName + "=\"" + attrValue + "\"");
			}
		}

		System.out.print(">");

		for (int i = 0; i < children.getLength(); i++)
		{
			Node node = children.item(i);
			// 获得结点的类型
			short nodeType = node.getNodeType();

			if (nodeType == Node.ELEMENT_NODE)
			{
				// 是元素，继续递归
				parseElement((Element) node);
			}
			else if (nodeType == Node.TEXT_NODE)
			{
				// 递归出口
				System.out.print(node.getNodeValue());
			}
			else if (nodeType == Node.COMMENT_NODE)
			{
				System.out.print("<!--");

				Comment comment = (Comment) node;

				// 注释内容
				String data = comment.getData();

				System.out.print(data);

				System.out.print("-->");
			}
		}

		System.out.print("</" + tagName + ">");
	}
}
